package com.aaa.ssm.service.impl;

import com.aaa.ssm.dao.RoleDao;
import com.aaa.ssm.entity.Role;
import com.aaa.ssm.service.RoleService;
import com.aaa.ssm.util.ConstantUtil;
import com.aaa.ssm.util.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Service
public class RoleServiceImpl implements RoleService {

    @Resource //依赖注入
    private RoleDao roleDao;
    // 依赖注入 用于给添加修改赋予名字
    @Resource
    HttpSession session;

    /**
     * 查询所有启用职位(添加员工时,下拉框使用)
     *
     * @return
     */
    @Override
    public List<Role> queryAll() {
        Role role = new Role();
        role.setStatus(String.valueOf(ConstantUtil.PositionStatus.ENABLED));
        return roleDao.queryParam(role);
    }

    /**
     * 查询所有的角色名称
     * @return
     */
    @Override
    public List<Role> queryIdAll() {
        //调用dao层方法
        List<Role> roles = roleDao.queryIdAll();
        if (roles!=null && roles.size()>0){
            return roles;
        }
        return null;
    }

    /**
     * 实现分页带参查询
     *
     * @param page
     * @return
     */
    @Override
    public PageInfo queryPage(Page<Role> page) {
        //使用PageHelper
        //设置分页页码 pageNo 和每页显示数量 pageSize
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //执行后端查询，把查询结果封装为Role并返回
        return new PageInfo<Role>(roleDao.queryParam(page.getData()));
    }

    /**
     * 根据参数查询
     * @param roleId
     * @return
     */
    @Override
    public Role queryById(int roleId) {
        List<Role> roleList = roleDao.queryById(roleId);
        if (roleList != null && roleList.size() > 0) {
            return roleList.get(0);
        }
        return null;
    }


    /**
     * 根据编号删除数据
     *
     * @param roleId
     * @return
     */
    @Override
    public int deleteById(int roleId) {
        return roleDao.deleteById(roleId);
    }
    /**
     * 实现权限和角色的关联
     * @param roleId
     * @param menuIds
     * @return
     */



    /**
     * 增加数据
     * @param role
     * @return
     */
    public int add(Role role) {
        //获取当前时间
        Date date = new Date();
        //实例化格式化时间类
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //format格式化时间
        String format = simpleDateFormat.format(date);
        //将时间赋值
        role.setCreateTime(format);
        //获取设置的loginA值 并进行转换
        String loginA = (String) session.getAttribute("loginA");
        //将登录人名字赋值
        role.setCreateBy(loginA);
        //调用dao层的添加方法
        return roleDao.add(role);
    }

    /**
     * 更新数据
     * @param role
     * @return
     */
    @Override
    public int update(Role role) {
        try {
            //获取当前时间
            Date date = new Date();
            //实例化格式化时间类
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //format格式化时间
            String format = simpleDateFormat.format(date);
            //将时间赋值
            role.setUpdateTime(format);
            //获取设置的loginA值 并进行转换
            String loginA = (String) session.getAttribute("loginA");
            //进行赋值更新
            role.setUpdateBy(loginA);
            //调用dao层的更新方法
            roleDao.update(role);
            return 1;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 查询角色权限关联表 根据角色Id查询该角色关联的所有权限Id集合
     * @param roleId
     * @return
     */
    @Override
    public List<Integer> queryMenuIdListByRid(int roleId) {
        return roleDao.queryMenuIdListByRid(roleId);
    }

    /**
     * 根据角色ID批量删除该角色对应角色权限关联
     * @param roleId
     * @return
     */
    @Override
    public int deletePosMenuByPosId(int roleId) {
        return roleDao.deleteRoleByRoleId(roleId);
    }

    @Transactional //保证该方法中的调用的所有方法一起提交或者一起回滚    spring事务
    @Override
    public int addPosAndMenu(int roleId, String menuIds) {
        //1,先调用根据角色批量删除 角色权限关联的方法
        this.deletePosMenuByPosId(roleId);
        //2,再添加关联
        //posId = 1   每次一个值 角色/职位编号
        //menuIds = "100,101,102,200,201,300"
        //添加是否成功标识符
        boolean flag = true;
        //判断menuIds是否为空 不为空时，分割，添加
        if (!StringUtils.isEmpty(menuIds)) {
            //menuIdArray=[100,101,102,200,201,300]
            String[] menuIdArray = menuIds.split(",");
            for (String menuId : menuIdArray) {
                //第1次 100  第2次 101 .....最后一次 300  valueOf 把数字格式的字符串转数字
                int i = roleDao.addPosAndMenu(roleId, Integer.valueOf(menuId));
                if (i < 1) {
                    flag = false;
                }
            }
        }
        //如果循环添加结束，flag仍然是true说明 全部成功
        if (flag) {
            return 0;
        }
        return 1;
    }
}
